//
//  main.c
//  const关键字
//
//  Created by ws on 2017/7/21.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>

/**
 const
 1.const:说明定义的变量是只读的
 2.const:修饰一个普通变量,表示这个变量是只读的,不可以修改的
 3.const:修饰数组,表示数组是只读的,必须定义的时候进行初始化
 4.const:的位置与其类型的位置是可以调换的
 5.const:修饰指针的时候,如果const放在*前面,表示指针指向的内容是只读的,不可以通过指针修改它所指向的存储内容
         如果const在*后面说明指针本身是只读的，不能改变指针的指向
 6.const:修饰形参 
         1.保证这个形参不会被函数修改
         2.同时也可以告诉函数的调用者,本函数不会修改它里面的内容
         3.可以提高函数可读性
 
 7.const修饰函数返回值说明它的返回值不能修改

 */
void test(){
    // const 修饰普通变量
    const int a = 10;
    int const b = 20;//的位置与其类型的位置是可以调换的
    //    b = 20;//修饰一个普通变量,表示这个变量是只读的,不可以修改的
    //    const int c;
    
    //const 修饰数组
    int const nums[] = {1,2,3};
    //    nums[1] = 10;//修饰数组,表示数组是只读的,必须定义的时候进行初始化
    
    //const 修饰指针修饰指针的时候,如果const放在*前面,表示指针指向的内容是只读的,不可以通过指针修改它所指向的存储内容,如果const在*后面说明指针本身是只读的,不能改变指针的指向
    int num = 10;
    int num1 = 20;
    int const*p = &num; //const在int前面后者后面都是一样的,内容只读,指针指向可以改变
//        *p = 40;//此行代码错误 不能修改指针指向的内容
    p = &num1;//能改变指针的指向
    int * const pp = &num;
//        pp = &num1;//此行代码错误  不能从新指向
    const int * const ppp = &num;
    
    //    ppp = &num1;
    //    *ppp = 60
}
/**
 const可以修饰形参
 @param argc 说明当程序启动的时候需要从控制台传入的参数的个数
 @param argv (指针数组,存储的是指针) 从控制台传入的参数的值
 比如:下面
 char * argv存储的是一个字符串指针
  char * argv[] 存储的是字符串数组里好多字符串指针
 */
#include <string.h>
/*
  const修饰形参:
   1.保证这个形参不会被函数修改
   2.同时也可以告诉函数的调用者,本函数不会修改它里面的内容
   3.可以提高函数可读性
 strcpy(char * dest, const char *src);

 */
/**
 const:作为函数返回值说明它的返回值不能修改
 */
const char *week(int day){
    switch (day) {
        case 1:
            return "星期一";
        case 2:
            return "星期二";
        case 3:
            return "星期三";
        case 4:
            return "星期四";
        case 5:
            return "星期五";
        case 6:
            return "星期六";
        case 7:
            return "星期日";
            
        default:
            return "输入非法\n";
            break;
    }
}
int main(int argc, const char * argv[]) {
    const char *w = week(1);
    printf("%s",w);
    return 0;
}
